package com.zjw.service;

import com.zjw.license.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * @author zjw
 * @date 2021/4/26 10:56
 */
@Service
public class LicenseService {

    /**
     * 项目的唯一识别码
     */
    @Value("${license.subject}")
    private String subject;

    /**
     * 私钥的别名
     */
    @Value("${license.privateAlias}")
    private String privateAlias;

    /**
     * 该密码是生成密钥对的密码 — 需要妥善保管，不能让使用者知道
     */
    @Value("${license.keyPass}")
    private String keyPass;

    /**
     * 该密码是访问密钥库的密码 — 使用 keytool 生成密钥对时设置，使用者知道该密码
     */
    @Value("${license.storePass}")
    private String storePass;

    /**
     * 证书生成路径
     */
    @Value("${license.licensePath}")
    private String licensePath;

    /**
     * 密钥库的地址
     */
    @Value("${license.privateKeysStorePath}")
    private String privateKeysStorePath;

    /**
     * 发布日期
     */
    @Value("${license.issuedTime}")
    private String issuedTime;

    /**
     * 失效日期
     */
    @Value("${license.expiryTime}")
    private String expiryTime;

    /**
     * 获取服务器硬件信息
     *
     * @return LicenseCheckModel
     */
    private LicenseCheckModel getServerInfos() {
        //操作系统类型
        String osName = System.getProperty("os.name").toLowerCase();
        AbstractServerInfos abstractServerInfos;
        //根据不同操作系统类型选择不同的数据获取方法
        if (osName.contains("windows")) {
            abstractServerInfos = new WindowsServerInfos();
        } else if (osName.contains("linux")) {
            abstractServerInfos = new LinuxServerInfos();
        } else {//其他服务器类型
            abstractServerInfos = new LinuxServerInfos();
        }
        return abstractServerInfos.getServerInfos();
    }

    /**
     * 根据私钥生成证书文件
     *
     * @return LicenseRes
     */
    public LicenseRes generateLicense() throws ParseException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        LicenseCreatorParam param = new LicenseCreatorParam();
        param.setLicenseCheckModel(getServerInfos());
        param.setSubject(subject);
        param.setPrivateAlias(privateAlias);
        param.setKeyPass(keyPass);
        param.setStorePass(storePass);
        param.setPrivateKeysStorePath(privateKeysStorePath);
        param.setIssuedTime(dateFormat.parse(issuedTime));
        param.setExpiryTime(dateFormat.parse(expiryTime));
        param.setLicensePath(licensePath);
        // 生成证书
        LicenseCreator licenseCreator = new LicenseCreator(param);
        boolean result = licenseCreator.generateLicense();
        LicenseRes licenseRes = new LicenseRes();
        BeanUtils.copyProperties(param, licenseRes);
        licenseRes.setResult(result);
        return licenseRes;
    }
}
